home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 026-050 / 049 / plot / palette.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  14KB  |  367 lines

  1. /***********************************************************************
  2. *  palette.c
  3. *     This program is useful for designing color palettes.
  4. * It may be used stand-alone (I would be setting the 'default map',
  5. * if preferences had a complete color map...), or you can use it
  6. * as a subroutine with minor modifications.
  7. *     One of the unique features of this program is that it prints
  8. * the hex value of the selected color, so you use it to generate
  9. * numeric values for use in programs.
  10. *     (c) 1985 by Charlie Heath of Microsmiths, this program is in
  11. * the public domain.  Not to be used commercially without permission
  12. * from MicroSmiths.
  13. ***********************************************************************/
  14.  
  15. #define I_REV   29
  16. #define G_REV   29
  17.  
  18. #define FAST register      /* Register type variable  */
  19.  
  20. #define DPTH 5       /* Raster dimensions */
  21. #define WDTH 320
  22. #define HGHT 200
  23.  
  24. #define BCOL 1          /* Background color for menus, etc   */
  25.  
  26. #define CTSIZ  32       /* In spite of myself, color table size   */
  27.  
  28. /****    Variables Initialized by init_colors()  **********/
  29. struct ColorMap *p_Co;
  30. USHORT *p_ct;           /* Color table as words */
  31. extern struct ViewPort *vp; 
  32. USHORT default_color[CTSIZ];     /* Save a copy of the defaults   */
  33.  
  34.  
  35. init_colors()
  36. {
  37. FAST int i;
  38.  
  39.    p_Co = (struct ColorMap *)GetColorMap(CTSIZ);
  40.    p_ct = (USHORT *)p_Co->ColorTable;
  41.  
  42.    for ( i=0; i<CTSIZ; i++)
  43.       default_color[i] = p_ct[i];
  44.    default_color[0] = 0x05a; default_color[1] = 0xfff;
  45.    default_color[2] = 0x002; default_color[3] = 0xf80;
  46.    default_color[31] = 0xeb0; default_color[4] = 0x00f;
  47.    default_color[5] = 0xf0f; default_color[6] = 0x0ff;
  48.    default_color[7] = 0xfff; default_color[8] = 0x620;
  49.    default_color[9] = 0xe50; default_color[10] = 0x9f1;
  50.    default_color[11] = 0xd22; default_color[12] = 0x55f;
  51.    default_color[13] = 0x92f; default_color[14] = 0x0f8;
  52.    default_color[15] = 0x000;
  53.    set_defmap();
  54. }
  55.  
  56. clear_colors()
  57. {
  58.    FreeColorMap(p_Co);
  59. }
  60.  
  61.  
  62. /****************************************************************
  63. * set_defmap()
  64. *    This routine sets up a 'default' color map.  It assumes
  65. * you have initialized the variable p_ct to point to a color
  66. * table, and that default_color has the colors you want.       */
  67. set_defmap()
  68. {
  69. FAST int i;
  70.  
  71.    for (i=0; i<CTSIZ ; i++)
  72.       *(p_ct+i) = default_color[i];
  73.  
  74.    set_cmap();
  75. }
  76.  
  77.  
  78.  
  79. /****************************************************************
  80. * set_cmap()
  81. *     This routine loads an updated p_ct color table into the
  82. * viewport.  You must have initialized the variables p_ct and
  83. * vp to point at color table and ViewPort                     */
  84. set_cmap()
  85. {
  86.    LoadRGB4(vp,p_ct,CTSIZ);
  87. }
  88.  
  89.  
  90. /***   palette modifier routines follow    ************************/
  91.  
  92. #define PLX 200      /* Palette Window Size  */
  93. #define PLY 132
  94.  
  95. #define PGAD 0             /* You can offset the gadgets here  */
  96. #define PGHI   PGAD+CTSIZ  /* Offset frm color selectors       */
  97.  
  98. struct IntuiText rtxt = {2,2,JAM1,-9,2,NL,(UBYTE *)"R",NL};
  99. struct IntuiText gtxt = {2,2,JAM1,-9,2,NL,(UBYTE *)"G",NL};
  100. struct IntuiText btxt = {2,2,JAM1,-9,2,NL,(UBYTE *)"B",NL};
  101.  
  102. struct Image    r_img, g_img, b_img;
  103. struct PropInfo r_prop,g_prop,b_prop;
  104.  
  105. struct Gadget blue_gad = {
  106.    NL, 17,112, 90,11, GADGHCOMP, GADGIMMEDIATE | RELVERIFY,
  107.    PROPGADGET,(APTR)&b_img, NL,
  108.    &btxt, NL,(APTR)&b_prop, PGHI+3, NL };
  109.  
  110. struct Gadget green_gad = {
  111.    &blue_gad, 17,97, 90,11, GADGHCOMP, GADGIMMEDIATE | RELVERIFY,
  112.    PROPGADGET,(APTR)&g_img, NL,
  113.    >xt, NL,(APTR)&g_prop, PGHI+4, NL };
  114.  
  115. struct Gadget red_gad = {
  116.    &green_gad, 17,82, 90,11, GADGHCOMP, GADGIMMEDIATE | RELVERIFY,
  117.    PROPGADGET,(APTR)&r_img, NL,
  118.    &rtxt, NL,(APTR)&r_prop, PGHI+5, NL };
  119.  
  120. struct IntuiText oktxt = {3,2,JAM2,8,2,NL,(UBYTE *)" OK ",NL};
  121. struct IntuiText cntxt = {3,2,JAM2,0,2,NL,(UBYTE *)"Cancel",NL};
  122. struct IntuiText retxt = {3,2,JAM2,4,2,NL,(UBYTE *)"Reset",NL};
  123.  
  124. struct IntuiText mstxt={2,2,JAM1,0,0,NL,(UBYTE *)"MicroSmiths Palette",NL};
  125.  
  126. char frog[] = "hex";
  127. struct IntuiText hxtxt = {3,2,JAM2,136,31,NL,(UBYTE *)frog,NL};
  128.  
  129. struct Gadget re_gad = {
  130.    &red_gad, 110,112, 54,11, GADGHCOMP, RELVERIFY,
  131.    BOOLGADGET, NL, NL,
  132.    &retxt, NL,NL, PGHI+2, NL };
  133. struct Gadget cn_gad = {
  134.    &re_gad, 110,97, 54,11, GADGHCOMP, RELVERIFY,
  135.    BOOLGADGET, NL, NL,
  136.    &cntxt, NL,NL, PGHI+1, NL };
  137. struct Gadget ok_gad = {
  138.    &cn_gad, 110,82, 54,11, GADGHCOMP, RELVERIFY,
  139.    BOOLGADGET, NL, NL,
  140.    &oktxt, NL,NL, PGHI, NL };
  141.  
  142. struct Image m3C[CTSIZ] = {
  143.    {0,0,16,16,1, NL ,0,0,NL },   /* Colors   */
  144.    {0,0,16,16,1, NL ,0,1,NL },
  145.    {0,0,16,16,1, NL ,0,2,NL },
  146.    {0,0,16,16,1, NL ,0,3,NL },
  147.    {0,0,16,16,1, NL ,0,4,NL },
  148.    {0,0,16,16,1, NL ,0,5,NL },
  149.    {0,0,16,16,1, NL ,0,6,NL },
  150.    {0,0,16,16,1, NL ,0,7,NL },
  151.    {0,0,16,16,1, NL ,0,8,NL },
  152.    {0,0,16,16,1, NL ,0,9,NL },
  153.    {0,0,16,16,1, NL ,0,10,NL },
  154.    {0,0,16,16,1, NL ,0,11,NL },
  155.    {0,0,16,16,1, NL ,0,12,NL },
  156.    {0,0,16,16,1, NL ,0,13,NL },
  157.    {0,0,16,16,1, NL ,0,14,NL },
  158.    {0,0,16,16,1, NL ,0,15,NL },
  159.    {0,0,16,16,1, NL ,0,16,NL },
  160.    {0,0,16,16,1, NL ,0,17,NL },
  161.    {0,0,16,16,1, NL ,0,18,NL },
  162.    {0,0,16,16,1, NL ,0,19,NL },
  163.    {0,0,16,16,1, NL ,0,20,NL },
  164.    {0,0,16,16,1, NL ,0,21,NL },
  165.    {0,0,16,16,1, NL ,0,22,NL },
  166.    {0,0,16,16,1, NL ,0,23,NL },
  167.    {0,0,16,16,1, NL ,0,24,NL },
  168.    {0,0,16,16,1, NL ,0,25,NL },
  169.    {0,0,16,16,1, NL ,0,26,NL },
  170.    {0,0,16,16,1, NL ,0,27,NL },
  171.    {0,0,16,16,1, NL ,0,28,NL },
  172.    {0,0,16,16,1, NL ,0,29,NL },
  173.    {0,0,16,16,1, NL ,0,30,NL },
  174.    {0,0,16,16,1, NL ,0,31,NL } };
  175.  
  176. struct Gadget palg[CTSIZ] = {
  177.    { &palg[1], 3, 3,  16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  178.       BOOLGADGET,  (APTR)&m3C[0], NL,NL,NL,NL, PGAD+0, NL},
  179.    { &palg[2], 19,3, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  180.       BOOLGADGET,  (APTR)&m3C[1], NL,NL,NL,NL, PGAD+1, NL},
  181.    { &palg[3], 35,3, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  182.       BOOLGADGET,  (APTR)&m3C[2], NL,NL,NL,NL, PGAD+2, NL},
  183.    { &palg[4], 51,3, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  184.       BOOLGADGET,  (APTR)&m3C[3], NL,NL,NL,NL, PGAD+3, NL},
  185.    { &palg[5], 67,3, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  186.       BOOLGADGET,  (APTR)&m3C[4], NL,NL,NL,NL, PGAD+4, NL},
  187.    { &palg[6], 83,3, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  188.       BOOLGADGET,  (APTR)&m3C[5], NL,NL,NL,NL, PGAD+5, NL},
  189.    { &palg[7], 99,3, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  190.       BOOLGADGET,  (APTR)&m3C[6], NL,NL,NL,NL, PGAD+6, NL},
  191.    { &palg[8],115,3,  16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  192.       BOOLGADGET,  (APTR)&m3C[7], NL,NL,NL,NL, PGAD+7, NL},
  193.    { &palg[9], 3,19, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  194.       BOOLGADGET,  (APTR)&m3C[8], NL,NL,NL,NL, PGAD+8, NL},
  195.    { &palg[10],19,19, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  196.       BOOLGADGET,  (APTR)&m3C[9], NL,NL,NL,NL, PGAD+9, NL},
  197.    { &palg[11],35,19, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  198.       BOOLGADGET,  (APTR)&m3C[10], NL,NL,NL,NL, PGAD+10, NL},
  199.    { &palg[12],51,19, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  200.       BOOLGADGET,  (APTR)&m3C[11], NL,NL,NL,NL, PGAD+11, NL},
  201.    { &palg[13],67,19, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  202.       BOOLGADGET,  (APTR)&m3C[12], NL,NL,NL,NL, PGAD+12, NL},
  203.    { &palg[14],83,19, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  204.       BOOLGADGET,  (APTR)&m3C[13], NL,NL,NL,NL, PGAD+13, NL},
  205.    { &palg[15],99,19,16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  206.       BOOLGADGET,  (APTR)&m3C[14], NL,NL,NL,NL, PGAD+14, NL},
  207.    { &palg[16],115,19,16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  208.       BOOLGADGET,  (APTR)&m3C[15], NL,NL,NL,NL, PGAD+15, NL},
  209.    { &palg[17], 3,35, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  210.       BOOLGADGET, (APTR)&m3C[16], NL,NL,NL,NL, PGAD+16, NL},
  211.    { &palg[18],19,35, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  212.       BOOLGADGET,  (APTR)&m3C[17], NL,NL,NL,NL, PGAD+17, NL},
  213.    { &palg[19],35,35, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  214.       BOOLGADGET,  (APTR)&m3C[18], NL,NL,NL,NL, PGAD+18, NL},
  215.    { &palg[20],51,35, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  216.       BOOLGADGET,  (APTR)&m3C[19], NL,NL,NL,NL, PGAD+19, NL},
  217.    { &palg[21],67,35, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  218.       BOOLGADGET,  (APTR)&m3C[20], NL,NL,NL,NL, PGAD+20, NL},
  219.    { &palg[22],83,35, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  220.       BOOLGADGET,  (APTR)&m3C[21], NL,NL,NL,NL, PGAD+21, NL},
  221.    { &palg[23],99,35,16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  222.       BOOLGADGET,  (APTR)&m3C[22], NL,NL,NL,NL, PGAD+22, NL},
  223.    { &palg[24],115,35,16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  224.       BOOLGADGET,  (APTR)&m3C[23], NL,NL,NL,NL, PGAD+23, NL},
  225.    { &palg[25], 3,51, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  226.       BOOLGADGET, (APTR)&m3C[24], NL,NL,NL,NL, PGAD+24, NL},
  227.    { &palg[26],19,51, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  228.       BOOLGADGET,  (APTR)&m3C[25], NL,NL,NL,NL, PGAD+25, NL},
  229.    { &palg[27],35,51, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  230.       BOOLGADGET,  (APTR)&m3C[26], NL,NL,NL,NL, PGAD+26, NL},
  231.    { &palg[28],51,51, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  232.       BOOLGADGET,  (APTR)&m3C[27], NL,NL,NL,NL, PGAD+27, NL},
  233.    { &palg[29],67,51, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  234.       BOOLGADGET,  (APTR)&m3C[28], NL,NL,NL,NL, PGAD+28, NL},
  235.    { &palg[30],83,51, 16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  236.       BOOLGADGET,  (APTR)&m3C[29], NL,NL,NL,NL, PGAD+29, NL},
  237.    { &palg[31],99,51,16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  238.       BOOLGADGET,  (APTR)&m3C[30], NL,NL,NL,NL, PGAD+30, NL},
  239.    { &ok_gad, 115,51,16,16, GADGHBOX | GADGIMAGE, RELVERIFY,
  240.       BOOLGADGET,  (APTR)&m3C[31], NL,NL,NL,NL, PGAD+31, NL} };
  241.  
  242.  
  243. /* Used to open a Window   */
  244. struct NewWindow NewCmod = {
  245.    40,30, PLX,PLY, 2,BCOL, NL,    /* IDCMP set up AFTER CALL */
  246.    ACTIVATE | SMART_REFRESH,
  247.    &palg[0],NL, NL,    /* FirstGadget, CheckMark, Title  */
  248.    NL,NL,              /* MUST SET SCREEN AFTER OPENSCREEN!!! */
  249.    PLX,PLY,PLX,PLY, CUSTOMSCREEN }; /* MinW, MinH, MaxW, MaxH */
  250.  
  251.  
  252. /********************************************************************
  253. * palette(window)
  254. *    This is the meat. This routine opens the palette window and
  255. * retains control until the user selects the OK or CANCEL gadget.
  256. *     The calling arguement is a window pointer.  That window
  257. * is expected to have opened an IDCMP port, which palette uses.
  258. ********************************************************************/
  259. palette(calling_window)
  260. struct Window *calling_window;
  261. {
  262. struct Window *cW;      /* Palette window handle   */
  263.  
  264. FAST struct IntuiMessage *imsg;
  265. FAST struct Gadget *igad;
  266.  
  267. FAST int class,cursel;
  268. BOOL keepon,munge;
  269.  
  270. USHORT backup[CTSIZ];         /* This table restores calling colors... */
  271.  
  272. static char hxtab[16] = { '0','1','2','3','4','5','6','7','8',
  273.    '9','a','b','c','d','e','f' };
  274.  
  275.    for ( cursel=CTSIZ-1; cursel >= 0; cursel--)
  276.       backup[cursel] = p_ct[cursel];
  277.  
  278.    r_prop.Flags = g_prop.Flags = b_prop.Flags = FREEHORIZ | AUTOKNOB;
  279.    r_prop.HorizBody = g_prop.HorizBody = b_prop.HorizBody = 0x1000;
  280.  
  281.    /* Get screen from calling window   */
  282.    NewCmod.Screen = calling_window->WScreen;  /* NEED TO SET SCREEN!!! */
  283.    if ( ! (cW = (struct Window *)OpenWindow(&NewCmod)) ) {
  284.       return(FALSE); /* Oops...  */
  285.       }
  286.  
  287.    PrintIText(cW->RPort,&mstxt,7,71);
  288.  
  289.    cW->UserPort = calling_window->UserPort;
  290.    ModifyIDCMP(cW, GADGETUP | GADGETDOWN | MENUVERIFY );
  291.  
  292.    for ( munge = keepon = TRUE; keepon; ) {
  293.  
  294.       if ( munge ) {
  295.          SetAPen(cW->RPort,cursel);
  296.          RectFill(cW->RPort,133,3,PLX-5,66);
  297.  
  298.          /* RJ will proably cringe if he see's this, but it is proably */
  299.          /* safe to modify the HorizPot values this way, UNLESS the    */
  300.          /* gadgets were being fiddled with when you do it. Here that  */
  301.          /* is quite unlikely, since another gadget was just activated */
  302.          /* to cause the munge flag to be set...                       */
  303.  
  304.          r_prop.HorizPot = (p_ct[cursel] & 0xf00) << 4;
  305.          g_prop.HorizPot = (p_ct[cursel] & 0x0f0) << 8;
  306.          b_prop.HorizPot = p_ct[cursel] << 12;
  307.          RefreshGadgets(&red_gad,cW,NL);
  308.          munge = FALSE;
  309.          hxtxt.FrontPen = cursel ^ 15;
  310.          hxtxt.BackPen  = cursel;
  311.          }
  312.  
  313.       while ( ! (imsg=(struct IntuiMessage *)GetMsg(cW->UserPort)) ) {
  314.          class = p_ct[cursel] = ((r_prop.HorizPot >> 4) & 0xf00) +
  315.             ((g_prop.HorizPot >> 8) & 0xf0) + (b_prop.HorizPot >>12);
  316.          set_cmap();
  317.  
  318.          frog[0] = hxtab[class >> 8];
  319.          frog[1] = hxtab[ (class >> 4) & 0x0f];
  320.          frog[2] = hxtab[class & 0x0f];
  321.          PrintIText(cW->RPort,&hxtxt,0,0);
  322.  
  323.          /* Proably, should do a WaitPort(cW->UserPort); */
  324.          /* I didn't, so the color updates faster.       */
  325.          /* In a multitasking environment, the system is */
  326.          /* being gronked...                             */
  327.          }
  328.  
  329.       igad =(struct Gadget *) imsg->IAddress;
  330.       if ( (class = imsg->Class) == MENUVERIFY ) {
  331.          imsg->Code = MENUCANCEL;      /* Don't Let Em Out! */
  332.          DisplayBeep(NL);
  333.          }
  334.       ReplyMsg(imsg);
  335.  
  336.       switch ( class ) {
  337.          case GADGETUP:
  338.          case GADGETDOWN:
  339.             if ((igad->GadgetID >= PGAD)&&(igad->GadgetID < PGAD+CTSIZ)) {
  340.                cursel = igad->GadgetID - PGAD;
  341.                munge = TRUE;
  342.                }
  343.             else switch ( igad->GadgetID ) {
  344.                case PGHI+1:      /* Cancel   */
  345.                   for ( class =0 ; class<CTSIZ; class++)
  346.                      p_ct[class] = backup[class];
  347.                   set_cmap();
  348.                case PGHI:        /* OK */
  349.                   keepon = FALSE;
  350.                   break;
  351.  
  352.                case PGHI+2:      /* Reset */
  353.                   set_defmap();
  354.                   munge = TRUE;
  355.                   break;
  356.                }
  357.          }
  358.       }
  359.  
  360.    cW->UserPort = NL;
  361.    CloseWindow(cW);
  362.    return(TRUE);
  363. }
  364.  
  365.  
  366. /*************************************************************/
  367.